/*
 * LWSDK Header File
 * Copyright 1999, NewTek, Inc.
 *
 * LWOBJIMP.H -- LightWave Object Importers
 *
 * When LightWave encounters a foreign object file which it cannot parse, 
 * it will call an "ObjectLoader" class server to import it.  All the 
 * loaders defined for the host will be activated in sequence, and the 
 * first one to recognize the file will load it.
 */
#ifndef LWSDK_OBJIMP_H
#define LWSDK_OBJIMP_H

#include <lwsdk/lwmonitor.h>
#include <lwsdk/lwmeshes.h>

#define LWOBJECTIMPORT_CLASS	"ObjectLoader"
#define LWOBJECTIMPORT_VERSION	3


/*
 * The activation function of the server is passed an LWObjectImport 
 * structure as its local data which includes the filename of the object
 * to load.  The loader attempts to parse the input file and calls the
 * embedded callbacks to insert the data into LightWave.  It indicates 
 * its success or failure by setting the 'result' field, and the optional
 * failedBuf.
 *
 * result	set by the server to one of the LWOBJIM values below.
 *
 * filename	the filename of the object to load.
 *
 * monitor	progress monitor that can be used to track the import
 *		process.
 *
 * failedBuf	string buffer for the server to store a human-readable
 *		error message if the result code is LWOBJIM_FAILED.
 *
 * data		private data pointer to be passed to all the embedded
 *		function callbacks.
 *
 * done		called when object import is complete.
 *
 * layer	start a new layer in the import data.  The layer is
 *		defined by an index number and a name string.
 *
 * pivot	set the pivot point for the current layer.
 *
 * parent	set the index of the parent layer for the current layer.
 *
 * lFlags	set the flag bits for the current layer.  The low-order bit
 *		is set if this is a hidden layer.
 *
 * point	add a new point to the current layer.  The point is given
 *		by an XYZ position and the function returns a void pointer
 *		as point identifier.
 *
 * vmap		select a VMAP for assigning data to points, creating a new
 *		VMAP if it does not yet exist.  The VMAP is defined by a
 *		type, dimension and name.
 *
 * vmapVal	set a vector for a point into the currently selected VMAP.
 *		The vector should have the same dimension as the VMAP.
 *
 * vmapPDV	set a vector for a point with reference to a specific polygon.
 *		This is the "polygon discontinuous value" for the point.
 *
 * polygon	add a new polygon to the current layer.  The polygon is
 *		defined by a type code, type-specific flags and a list of
 *		point identifiers.
 *
 * polTag	associate a tag string to the given polygon.  The tag
 *		string has a type, the most common being 'SURF'.
 *
 * surface	add a new surface to this object.  The surface is defined by
 *		the base name, the reference name, and a block of raw surface
 *		data.
 */
typedef struct st_LWObjectImport {
	int		  result;
	const char	 *filename;
	LWMonitor	 *monitor;
	char		 *failedBuf;
	int		  failedLen;

	void		 *data;

	void		(*done)    (void *);
	void		(*layer)   (void *, int lNum, const char *name);
	void		(*pivot)   (void *, const LWFVector pivot);
	void		(*parent)  (void *, int lNum);
	void		(*lFlags)  (void *, int flags);
	LWPntID		(*point)   (void *, const LWFVector xyz);
	void		(*vmap)    (void *, LWID type, int dim, const char *name);
	void		(*vmapVal) (void *, LWPntID point, const float *val);
	LWPolID		(*polygon) (void *, LWID type, int flags, int numPts, const LWPntID *);
	void		(*polTag)  (void *, LWPolID polygon, LWID type, const char *tag);
	void		(*surface) (void *, const char *, const char *, int, void *);
	void		(*vmapPDV) (void *, LWPntID point, LWPolID polygon, const float *val);
} LWObjectImport;


/*
 * The server must set the 'result' field to one of these following values
 * before it returns.
 *
 * OK		indicates successful parsing of the object file.
 *
 * BADFILE	indicates that the loader could not open the file.
 *
 * NOREC	indicates that the loader could open the file but could
 *		not recognize the format.
 *
 * ABORTED	indicates the that the user manually aborted the load.
 *
 * Any other failure is indicated by the generic FAILED value.  In this case,
 * the loader may also place a human-readable error message into the buffer
 * pointed to by `failedBuf,' provided that `failedLen' is non-zero.
 */
#define LWOBJIM_OK	 0
#define LWOBJIM_NOREC	 1
#define LWOBJIM_BADFILE	 2
#define LWOBJIM_ABORTED	 3
#define LWOBJIM_FAILED	 99


#endif

